(算法)C语言模拟约瑟夫环问题

本文介绍了约瑟夫环问题,即m个人围坐一圈,按1到n报数,报到n的人出圈,然后从下一个人重新开始,直到所有人都出圈。通过C语言使用循环链表来模拟此过程,详细阐述了算法思路和具体代码实现。
摘要由CSDN通过智能技术生成

约瑟夫环问题描述

m个人围坐一圈,每人持有一个数字,从第一个人开始从1报数,报到n(第一轮n任意给定)的人出圈,将n改为这个出圈的人所持有的数字,下个人开始从1报数,继续报到n的人出列;依次类推直到所有人出圈。

C语言模拟该过程算法

这里采用带有尾结点的循环单向链表存储玩家信息,p和pre两个指针分别指向报数结点和该结点的直接前驱,并同步移动n-1次,删除p指向的结点直至链表为空即可。

具体代码

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
    int id;//玩家编号
    int pw;//玩家持有的数字
    struct node *next;
}node,*LinkList;
/*
用带头结点的尾插法创建有n个结点的循环链表,并返回尾结点
*/
LinkList CreateList(LinkList head,int n){
    head->next = NULL;//头结点
    head->id = 0;
    node *r = head;//工作指针,跟随最后一个结点
    for(int i=0;i<n;i++){
        node *S = (node*)malloc(sizeof(node));
        S->id = i+1;
        printf("input player%d's password:\n",i+1);
        scanf("%d",&S->pw);
        r->next = S;
        r &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值